package main
import (
	"fmt"
	"time"
	"sync"
)

	// 需求：现在要计算 1-200 的各个数的阶乘，并且把各个数的阶乘放入到 map 中。
	// 最后显示出来。要求使用 goroutine 完成
	// 思路 
	// 1. 编写一个函数，来计算各个数的阶乘，并放入到 map 中. 
	// 2. 我们启动的协程多个，统计的将结果放入到 map 中
	// 3. map 应该做出一个全局的.

var (
	myMap = make(map[int]int,10)
	// 声明一个全局的互斥锁
	// lock 是一个全局的互斥锁
	// sync 是包：synchornized 同步
	// Mutex ： 是互斥
	lock sync.Mutex


)

func test(n int){
	res :=1
	for i:=1;i<=n;i++{
		res*=n
	}

	lock.Lock()
	myMap[n]= res  // 问题1 concurrent map writes
	lock.Unlock()
}
func main() {
	// 我们这里开启多个协程完成这个任务[200 个]
	for i:=1;i<=200;i++{
		go test(i)
	}
	// 问题2 等多久
	time.Sleep(time.Second*10)

	lock.Lock()
	// 输出结果
	for i,v :=range myMap{
		fmt.Printf("map[%v]=%d\n",i,v)
	}
	lock.Unlock()


}